import router from '@/router';
import store from '@/store';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';

function doneNProgress() {
  setTimeout(() => {
    NProgress.done(); // 由于重定向后，不会进入后置守卫，所以这里要关闭进度条
  }, 100);
}

const whiteList = ['login', '404'];

router.beforeEach(async (to, from, next) => {
  console.log('beforeEach', to);
  NProgress.start();
  if (store.state.user.token) {
    if (to.name === 'login') {
      next({ name: 'Dashboard' }); // 重定向（不会触发新一轮守卫），会中断当前正常的导航，后置守卫不会进去了
      doneNProgress();
    } else {
      if (!store.state.user.userInfo?.base?.userId) {
        const userInfo = await store.dispatch('user/getUserInfo');
        const routes = await store.dispatch('permission/filterRoutes', userInfo.base.roles.menus);
        // 这个 * 统配符 的路由规则，顺序不管是放在哪里，VueRouter 内部会将其放到最后！
        router.addRoutes([{ path: '*', redirect: '/404', hidden: true }, ...routes]);
        next(to); // 中断当前导航，进行一个新的导航
      } else {
        next(); // 只有正常放行时，后置守卫才能进去
      }
    }
  } else {
    if (whiteList.includes(to.name)) {
      next();
    } else {
      next({ name: 'login' });
      doneNProgress();
    }
  }
});

router.afterEach(() => {
  console.log('afterEach');
  doneNProgress(); // 在这里关闭进度条的时机更合理一些，因为此时导航动作才完成了
});
